package ecom;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import javax.swing.plaf.OptionPaneUI;

import org.ow2.util.log.Log;
import org.ow2.util.log.LogFactory;

import ecom.stateful.ItemAchat;
import ecom.stateful.PanierStateful;
import ecom.api.*;
import ecom.entity.OptionPayante;

@ManagedBean(name = "panierSessionBean")
@SessionScoped
// les donnees sont conservees au cours des echnages entre un meme client
public class Panier implements Serializable {

	public IPanierStatefulRemote panier;
	public float total = 0; 
	
	
	private long idAnnonceASupprimee;
	public long getIdAnnonceASupprimee() {
		return idAnnonceASupprimee;
	}

	public void setIdAnnonceASupprimee(long idAnnonceASupprimee) {
		this.idAnnonceASupprimee = idAnnonceASupprimee;
	}

	private OptionPayante optionPanyanteASupprimee;
	
	public OptionPayante getOptionPanyanteASupprimee() {
		return optionPanyanteASupprimee;
	}

	public void setOptionPanyanteASupprimee(OptionPayante optionPanyanteASupprimee) {
		this.optionPanyanteASupprimee = optionPanyanteASupprimee;
	}

	public float getTotal() {
		return total;
	}

	public void setTotal(float total) {
		this.total = total;
	}

	public IPanierStatefulRemote getPanier() {
		return panier;
	}

	public void setPanier(IPanierStatefulRemote panier) {
		this.panier = panier;
	}

	private List<ItemAchat> listeAchat = new ArrayList<ItemAchat>();
	private Log log = LogFactory.getLog(PanierStateful.class);

	public Panier(List<ItemAchat> listeAchat) {
		super();
		log.info("panier(avec params)");
		this.listeAchat = listeAchat;
	}

	public Panier() {
		log.info("debut Panier()");
		try {

			FacesContext facesContext = FacesContext.getCurrentInstance();
//			ExternalContext externalContext = facesContext
//					.getExternalContext();
//			HttpSession http = (HttpSession)externalContext.getSession(true);
//			http.setMaxInactiveInterval(-1);//negative =>jamais effacher 

			//javax.naming.Context cnt = (Context) externalContext;
			javax.naming.Context ic = new javax.naming.InitialContext();
			panier = (IPanierStatefulRemote) ic
					.lookup("ecom.stateful.PanierStateful@Remote");
			if(panier!=null)
			{
				panier.testPanier();				
			}
			else 
				log.error("error panier stateful null");

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance PanierStateful introuvable", e);
		}
		log.info("fin Panier()");
	}

	public List<ItemAchat> getListeAchat() {
		return listeAchat;
	}

	public void setListeAchat(List<ItemAchat> listeAchat) {
		this.listeAchat = listeAchat;
		log.info("fin setListeAchat");
	}

	public void rajouterItems(long idAnnonce, String titreAnnonce, Set<OptionPayante> setOptionsPayantes) {
		try {
			log.info("idAnnonce="+idAnnonce);
			log.info("titre annonce" +titreAnnonce);
			for (OptionPayante optionPanyante : setOptionsPayantes) {
				ItemAchat newItem = new ItemAchat(idAnnonce, titreAnnonce,
						optionPanyante);
				listeAchat.add(newItem);
				total += optionPanyante.getPrix(); 
				log.info("rajoute dans le panier {0} pour l'annonce {1}",
						optionPanyante.getNom(), titreAnnonce);
			}
			
			if (listeAchat.isEmpty())
				log.info(" Panier()  listeAchat vide => panier vid");
			else 
				log.info("Panier()  listeAchat non vide => panier non vid");

			panier.rajouterItems(idAnnonce, titreAnnonce, setOptionsPayantes);
		} catch (Exception e) {
			log.error("Instance PanierStateful introuvable");
		}
	}
	
	public String validationPayement() throws Exception
	{
		if(panier!=null)
		{
			log.info("panier non vide appele finaliser achat");
			panier.FinaliserAchat();
			listeAchat.clear();
		}
			
		else 
		{
			log.error("le panier n'existe pas!");
			throw new Exception("On a une probleme sur le serveur! Votre achat ne peut pas etre valide!");
		}
		
		return "AnnoncesRecherche";
			
	}

	public void testPanier() {
		log.info("test instance panier sessionBean est ok");
	}
	
	public String testTotalPourPayement()
	{
		log.info("testTotalPourPayement");
		if(total==0)
		{
			FacesMessage fm = new FacesMessage("Le panier est vide!");
            FacesContext.getCurrentInstance().addMessage("Le panier est vide!", fm);
			
			return "Panier";
		}
		else return "Payement";
	}
	


	public String deleteOption()
	{
		log.info("start deleteOption");
		List<ItemAchat> listeAchatAux= new ArrayList<ItemAchat>();
		
		for(ItemAchat itemAchat:listeAchat)
			{
				if(itemAchat.getIdAnnonce() != idAnnonceASupprimee)
					listeAchatAux.add(itemAchat);
				else
					if(itemAchat.getOptionPanyante().getId()==optionPanyanteASupprimee.getId())
						{
						log.info("supprime l'option" +itemAchat.getOptionPanyante().getNom()+" et pour l'annonce" +itemAchat.getTitreAnnonce());
						total -=itemAchat.getOptionPanyante().getPrix();
						panier.supprimerItem(idAnnonceASupprimee,optionPanyanteASupprimee.getId());
						}
					else listeAchatAux.add(itemAchat);
						
			}	
		if(listeAchatAux!=null)
			listeAchat = new ArrayList<ItemAchat>(listeAchatAux);
		else 
			listeAchat = new ArrayList<ItemAchat>();
		
		log.info("out of deleteOption");
		return "Panier";
		
	}
	public String viderPanier()
	{
		panier.viderPanier();
		listeAchat.clear();
		total = 0;
		return "Panier";
		
	}

}
